﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionePolveriLib.Facades;
using GestionePolveriLib.BL;
using System.Transactions;
using GestionePolveriLib.Utilities;

namespace GestionePolveri2
{
    enum NewPolvereXXXXDialogStatus
    {
        Insert = 0,
        Modify
    }

    public partial class NewPolvereXXXXDialog : Form
    {
        private string m_codicePolvere = string.Empty;
        private Polvere m_polvere = null;
        private NewPolvereXXXXDialogStatus m_status = NewPolvereXXXXDialogStatus.Insert;
        private Polvere m_oldPolvere = null;
        private Colore m_oldColore = null;

        public Polvere Polvere
        {
            get { return m_polvere; }
            set 
            { 
                m_polvere = value;

                if (m_polvere != null)
                {
                    PolvereFacade pf = new PolvereFacade();
                    Polvere p = pf.Get(m_polvere.ID);

                    //comboBox.SelectedIndex = comboBox.FindString(item, -1);
                    this.dynCodicePolvereTextBox.Text = p.CodicePolvere;
                    this.dynDescrizioneTextBox.Text = p.Descrizione;
                    this.dynNoteTextBox.Text = p.Note;
                    this.dynScortaMinima.Text = p.ScortaMinima.ToString();
                    this.dynCmbFornitori.SelectedIndex = this.dynCmbFornitori.FindString(p.Fornitore.Descrizione, -1);
                    this.dynCmbColori.SelectedIndex = this.dynCmbColori.FindString(p.ColoriAbbinati, -1);
                    this.chkBase.Checked = (!string.IsNullOrWhiteSpace(p.Applicazione) ? (p.Applicazione.Contains("b") ? true : false) : false);
                    this.chkVenatura.Checked = (!string.IsNullOrWhiteSpace(p.Applicazione) ? (p.Applicazione.Contains("v") ? true : false) : false);

                    m_oldPolvere = p;
                    m_oldColore = (Colore)this.dynCmbColori.SelectedValue;

                    m_status = NewPolvereXXXXDialogStatus.Modify;
                    this.btnOk.Text = "Modifica";
                }
            }
        }

        public string CodicePolvere
        {
            get { return m_codicePolvere; }
            set { m_codicePolvere = value; }
        }

        public NewPolvereXXXXDialog()
        {
            InitializeComponent();

            if (!this.DesignMode)
            {
                this.btnCancel.Click += new EventHandler(btnCancel_Click);
                this.btnOk.Click += new EventHandler(btnOk_Click);

                this.dynDescrizioneTextBox.Text = "polvere XXXX";

                LoadFornitori();
                LoadColori();
            }
        }

        void btnOk_Click(object sender, EventArgs e)
        {
            try
            {
                if ((!this.chkBase.Checked) && (!this.chkVenatura.Checked))
                {
                    MessageBox.Show("Indicare se base o venatura !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (string.IsNullOrWhiteSpace(this.dynCodicePolvereTextBox.Text))
                {
                    MessageBox.Show("Indicare il codice polvere !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (((Fornitore)this.dynCmbFornitori.SelectedValue).ID == -1)
                {
                    MessageBox.Show("Selezionare un fornitore !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (((Colore)this.dynCmbColori.SelectedValue).ID == -1)
                {
                    MessageBox.Show("Selezionare un colore !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                Colore m_colore = (Colore)this.dynCmbColori.SelectedValue;

                ColoriFacade cc = new ColoriFacade();
                m_colore.Famiglia = cc.GetFamiglia(m_colore.ID);

                List<PolvereExt> m_polveri = new List<PolvereExt>();

                TipologiaSMPFacade m_tsmpfacade = new TipologiaSMPFacade();
                TipologiaScortaMinima m_tsm = m_tsmpfacade.Get("NON DEFINITA");

                using (TransactionScope transaction = new TransactionScope())
                {
                    PolvereFacade impf = new PolvereFacade();
                    Polvere data = new Polvere();
                    data.Descrizione = this.dynDescrizioneTextBox.Text;
                    data.Note = this.dynNoteTextBox.Text;
                    data.Fornitore = (Fornitore)this.dynCmbFornitori.SelectedValue;
                    data.ScortaMinima = (string.IsNullOrWhiteSpace(this.dynScortaMinima.Text) ? 0 : double.Parse(this.dynScortaMinima.Text));
                    data.IsCodiceCustom = true;
                    data.TipologiaSM = m_tsm;

                    if (m_status == NewPolvereXXXXDialogStatus.Insert)
                    {
                        data.CodicePolvere = "XXXX " + this.dynCodicePolvereTextBox.Text;

                        impf.Add(data);

                        m_polveri.Add(new PolvereExt(data) { Base = this.chkBase.Checked, Venatura = this.chkVenatura.Checked, Ufficiale=false, Superata=true });

                        ComposizioneColoreFacadeExt ccfExt = new ComposizioneColoreFacadeExt();
                        ComposizioneColoreExt ccExt = new ComposizioneColoreExt();
                        ccExt.Colore = m_colore;
                        ccExt.Polveri = m_polveri;
                        
                        Formula f = new Formula();
                        f.ComposizioneFormulaXInsert = ccExt;
                        f.Descrizione = string.Format("Formula generata automaticamente durante la creazione della polvere {0}", m_polveri[0].CodicePolvere);
                        f.Superata = true;
                        f.Ufficiale = false;
                        f.DataCreazione = DateTime.Now;

                        ccfExt.AddFormula(f);

                        //ccfExt.Add(ccExt);
                    }
                    else
                    {
                        data.CodicePolvere = this.dynCodicePolvereTextBox.Text;

                        data.ID = m_polvere.ID;
                        impf.Modify(data);

                        m_polveri.Add(new PolvereExt(data) { Base = this.chkBase.Checked, Venatura = this.chkVenatura.Checked, Ufficiale = false, Superata = true });

                        ComposizioneColoreFacadeExt ccfExt = new ComposizioneColoreFacadeExt();

                        Formula old_formula = ccfExt.GetFormula(m_oldColore.ID, m_oldPolvere.ID);
                        ccfExt.DeleteFormula(old_formula);


                        ////--------------------------------------////
                        ComposizioneColoreExt ccExt = new ComposizioneColoreExt();
                        ccExt.Colore = m_colore;
                        ccExt.Polveri = m_polveri;

                        Formula f = new Formula();
                        f.ComposizioneFormulaXInsert = ccExt;
                        f.Descrizione = string.Format("Formula generata automaticamente durante la creazione della polvere {0}", m_polveri[0].CodicePolvere);
                        f.Superata = true;
                        f.Ufficiale = false;
                        f.DataCreazione = DateTime.Now;

                        ccfExt.AddFormula(f);

                        //List<ComposizioneColoreExt> ccExts = ccfExt.GetByPolvere(data.ID);
                        //if (ccExts == null)
                        //{
                        //    ComposizioneColoreExt ccExt = new ComposizioneColoreExt();
                        //    ccExt.Colore = m_colore;
                        //    ccExt.Polveri = m_polveri;

                        //    ccfExt.Add(ccExt);
                        //}
                        //else
                        //{
                        //    foreach (ComposizioneColoreExt ccExt in ccExts)
                        //    {
                        //        ccExt.Colore = m_colore;
                        //        ccExt.Polveri = m_polveri;

                        //        ccfExt.Modify(ccExt);
                        //    }
                        //}
                    }

                    m_codicePolvere = data.CodicePolvere;

                    transaction.Complete();
                }

                MessageBox.Show("Codice Polvere XXXX aggiunto correttamente !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                this.DialogResult = System.Windows.Forms.DialogResult.OK;

                this.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("Errore: {0}", ex.Message), "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
        }

        void btnCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.Cancel;

            this.Close();
            this.Dispose();
        }

        #region Caricamento Combos...
        private void LoadFornitori()
        {
            FilterComboBoxHelper.SetupFornitoriComboBox(this.dynCmbFornitori);
        }

        private void LoadColori()
        {
            FilterComboBoxHelper.SetupColoriComboBox(this.dynCmbColori);
        }

        private void LoadColori(Action callback)
        {
            ColoriFacade pf = new ColoriFacade();

            pf.LoadAsync((result) =>
            {
                List<Colore> m_colori = new List<Colore>();
                m_colori.Add(new Colore() { CodiceColore = "Seleziona un colore", ID = -1 });
                m_colori.AddRange((List<Colore>)result);

                this.dynCmbColori.DisplayMember = "codicecolore";
                this.dynCmbColori.ValueMember = "id";
                this.dynCmbColori.DataSource = m_colori;

                callback();
            });
        }

        private void btnNewColor_Click(object sender, EventArgs e)
        {
            NewColoreDialog ncd = new NewColoreDialog();
            if (ncd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                Colore c = ncd.Colore;

                FilterComboBoxHelper.SetupColoriComboBox(this.dynCmbColori);

                int index = this.dynCmbColori.FindStringExact(c.CodiceColore, 0);
                this.dynCmbColori.SelectedIndex = index;

                //LoadColori(() =>
                //{
                //    int index = this.dynCmbColori.FindStringExact(c.CodiceColore, 0);
                //    this.dynCmbColori.SelectedIndex = index;
                //});
            }
        }
        #endregion
    }
}
